package learning.groovy.dynamic

class DynamicDemo {

	static main(args) {
		//17、动态性
		//Groovy所有的对象都有一个元类metaClass，我们可以通过metaClass属性访问该元类。通过元类，可以为这个对象增加方法（在java中不可想象）！见下面的代码，msg是一个String,通过元类，我们为msg增加了一个String 类中所没有的方法up：

		def msg = "Hello!"
		println msg.metaClass
		String.metaClass.up = {  delegate.toUpperCase() }
		println msg.up()

		//通过元类，我们还可以检索对象所拥有的方法和属性（就象反射）：
		//msg.metaClass.methods.each { println it.name }
		//msg.metaClass.properties.each { println it.name }

		//我们可以通过元类判断有没有一个叫up的方法，然后再调用它：
		if (msg.metaClass.respondsTo(msg, 'up')) {
			println msg.up()
		}
		//当然，也可以推断它有没有一个叫bytes的属性：
		if (msg.metaClass.hasProperty(msg, 'bytes')) {
			println msg.bytes.encodeBase64()
		}
	}

}
